package com.annotation.importannotation;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar  {

    /**
     * AnnotationMetadata:当前 Import注解所在类的注解信息
     * BeanDefinitionRegistry
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry ) {
        System.out.println("当前容器中定义的bean的数量" + registry.getBeanDefinitionCount());
        System.out.println("根据beanName获取容器中的bean" + registry.getBeanDefinition("person"));
        System.out.println("获取容器中所有定义的bean的名字" + registry.getBeanDefinitionNames());
        System.out.println("判断容器中是否有Blue的定义" + registry.containsBeanDefinition("com.annotation.entities.Blue"));
        //这里的 registry.containsBeanDefinition中的参数需要用全类名，因为注册组建的时候用的是@Import注解和Seletor，
        // 被注册进来的时候，Yellow和Red两个类的id都是全类名,这里的beanName就是id
        boolean b = registry.containsBeanDefinition("com.annotation.entities.Yellow");
        boolean b1 = registry.containsBeanDefinition("com.annotation.entities.Red");
        if (b && b1){
            /**
             * 下面是javadoc中对BeanDefinition的描述
             * BeanDefinition描述了bean实例，它具有属性值、构造函数参数值和具体实现提供的进一步信息。
             * 这只是一个很小的接口:主要目的是允许BeanFactoryPostProcessor(如PropertyPlaceholderConfigurer)进行自省和修改属性值和其他bean元数据。
             *
             * BeanDefinition有一个实现类，我们用RootBeanDefinition类对它进行实例化，传入的参数是
             */
            BeanDefinition beanDefinition = new RootBeanDefinition("com.annotation.entities.RainBow");
            //在这个为IOC容器中注册组建，有两个参数，一个是注册组建的beanName，一个是BeanDefinition
            registry.registerBeanDefinition("rainBow",beanDefinition);
        }
    }
}
